

package com.hazelcast.cluster.memberselector;

import com.hazelcast.cluster.Member;
import com.hazelcast.cluster.MemberSelector;
import com.hazelcast.cluster.memberselector.impl.AndMemberSelector;
import com.hazelcast.cluster.memberselector.impl.OrMemberSelector;

/**
 * A utility class to get {@link MemberSelector} instances.
 */
public final class MemberSelectors {

    /**
     * A {@link MemberSelector} instance that selects only lite members that own no partition
     */

    public static final MemberSelector LITE_MEMBER_SELECTOR = Member::isLiteMember;

    /**
     * A {@link MemberSelector} instance that selects only data members that own a partition
     */

    public static final MemberSelector DATA_MEMBER_SELECTOR = new MemberSelector() {
        @Override
        public boolean select(Member member) {
            return !member.isLiteMember();
        }
    };

    /**
     * A {@link MemberSelector} instance that selects only local members
     */

    public static final MemberSelector LOCAL_MEMBER_SELECTOR = Member::localMember;

    /**
     * A {@link MemberSelector} instance that selects only remote members
     */

    public static final MemberSelector NON_LOCAL_MEMBER_SELECTOR = new MemberSelector() {
        @Override
        public boolean select(Member member) {
            return !member.localMember();
        }
    };

    private MemberSelectors() {
    }

    /**
     * Selects a member when one of the selectors succeed
     *
     * @param selectors {@link MemberSelector} instances to iterate
     * @return a {@link MemberSelector} that selects a member when one of the sub-selectors succeed
     */
    public static MemberSelector or(MemberSelector... selectors) {
        return new OrMemberSelector(selectors);
    }

    /**
     * Selects a member when all of the selectors succeed
     *
     * @param selectors {@link MemberSelector} instances to iterate
     * @return a {@link MemberSelector} that selects a member when all of the sub-selectors succeed
     */
    public static MemberSelector and(MemberSelector... selectors) {
        return new AndMemberSelector(selectors);
    }

}
